import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Poli here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Poli extends Actor
{
   private Actor colicionObstaculo;
   private Actor colicionF;
   private Actor colicionTronco;
   private Actor collided;
   private int velocidad=1;  
   private Ladron l;
   private int dano;
   private int disp=0;
   
     public Poli (Ladron lad)
    {
     l=lad;
     dano=100;
    }
    
   /**
     * Act - do whatever the Poli wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
   */
    public void act() 
    { 
    
       limite();
       persige(velocidad);
        checaCollision(disp);
        if(dano<0)
          getWorld().removeObject(this);
          
   
    }   
    
    public void fuego()
    {
        World mundo=getWorld();
       
            Disparo bala=new Disparo();
            getWorld().addObject(bala,getX(),getY());
            
    }
    /**
     * metodo que se utiliza para marcar el limite al que debe llegar la policia, 
     * para que esta no salga del mundo ni de la carretera
     */
   public void limite()
    {
     int x=super.getX();
     int y=super.getY();
      
     //1.acceder al mundo con getWorld()
     World mundo=super.getWorld();
     //2. acceder al ancho del mundo con getWidth();
     int ancho=mundo.getWidth();
     //3.acceder al alto con getHeight();
     int alto=mundo.getHeight();
     if(x>=ancho-100)
              setLocation(x-20,getY()); 
     if(x<=100)
              setLocation(x+20,getY());
     if(y>=alto-120)
              setLocation(getX(),y-10);
     if(y<=180)
              setLocation(getX(),y+10); 
          
          
   }
    
   /**
    * metodo en el que se checan todas las coliciones relacionadas con el policia ya sea un obstaculo o al mismo fugitive
    */
    public void checaCollision(int di)
    {
         World mundo=getWorld();
          int d=((Mundo)mundo).dameDano();
        colicionObstaculo = getOneIntersectingObject(CarroObs.class);
         colicionF = getOneIntersectingObject(Ladron.class);
         
       
            int phO=l.getY()-((getImage().getHeight()/3)/2);
            int plO=l.getY()+((getImage().getHeight()/3)/2);
            int phF=getY()-(getImage().getHeight()/3)/2;
            int plF=getY()+(getImage().getHeight()/3)/2;
            int pihO=l.getY()+((getImage().getHeight()/2));
            int pilO=l.getY()-((getImage().getHeight()/2));
            int pxhO=l.getX()-((getImage().getWidth())/2);
        boolean destro=false;    
        if(colicionF!=null)
        {
           if((phO>phF&&phO<plF)||(plO>phF&&plO<plF))
          {
        
           
           Greenfoot.playSound("explosion.mp3");
           l.setLocation(l.getX()+20,l.getY());
           ((Mundo)mundo).cambiaDano(d-1);
            setLocation(getX()-20,getY());
            
           destro=true;
            }      
            
        }   
        
             if(plF<pilO)
            {
            mundo.setPaintOrder(Ladron.class,Poli.class);
            }
            else
            if(phF>pihO)
            {
            mundo.setPaintOrder(Poli.class,Ladron.class);
            }
        
        if (colicionObstaculo != null)
        {
           ((CarroObs)colicionObstaculo).explota();
           Greenfoot.playSound("explosion.mp3");
           dano=dano-10;
        }
         
         colicionTronco = getOneIntersectingObject(Tronco.class);
        
        if (colicionTronco != null)
        {
           ((Tronco)colicionTronco).explota();
           Greenfoot.playSound("explosion.mp3");
           setLocation(getX()-50,getY());
            dano=dano-10;
        }
        
       
         collided = getOneIntersectingObject(Disparo.class);
          if (collided != null || getX()==0)
         {
                disp++;
                if(disp==3)
                explota();
           
         }
    
    
    }
    
    /**
     * metodo en el que se le pasa la velocidad a la que va el policia y se aplica un logaritno para que la policia persiga al fugitive asta donde se valla
     */
    int ima=0;
    public void persige(int velocidad)
    {
       
     if(getY()<l.getY())
     {
       setLocation(getX(),getY()+velocidad);}
       else if(getY()>l.getY())
      
       {
        setLocation(getX(),getY()-velocidad);
        }  
          
      if(getX()<l.getX())
     {
       setLocation(getX()+velocidad,getY());
       ima++;
       if(ima>1)
        ima=0;
         cambia(ima);
    }
       else if(getX()>l.getX())
       {
        setLocation(getX()-velocidad-5,getY());
        }     
    
    }
    
    public void explota()
    {
         
        // placePedazos(getX(),getY(),nu);
         getWorld().removeObject(this);
         
    }
    
    public void cambia(int ima)
    {
        switch(ima)
        {
            case 0: 
                    setImage("police1.png");
                    break;
            
            case 1: 
                    setImage("police2.png");
                    break;
        }
    }
    
    /**
     * metodo en el que se retorna la variable dano del policia
     */
    public int dameDano()
    {
    return dano;
    }
}
